import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;

public class DoubleBufferingHardware extends Frame {
	// boucle d'affichage
	RenderingThread renderingThread = new RenderingThread();
	// variable permettant d'utiliser la mémoire VRAM
	BufferStrategy strategy;
	// buffer mémoire où les images et les textes sont appliqués
	Graphics buffer;
	int x = 0; // coordonnée x de l'affichage du texte

	public DoubleBufferingHardware() {
		setSize(400, 400);
		setVisible(true);

		// inhibe la méthode courante d'affichage du composant
		setIgnoreRepaint(true);

		// on créé 2 buffers dans la VRAM donc c'est du double-buffering
		createBufferStrategy(2);

		// récupère les buffers graphiques dans la mémoire VRAM
		strategy = getBufferStrategy();
		buffer = strategy.getDrawGraphics();
		renderingThread.start();
	}

	public void graphicalRender() {
		buffer.setColor(Color.black);
		buffer.fillRect(0, 0, 400, 400);
		buffer.setColor(Color.white);
		buffer.drawString("affichage d'une ligne de texte", x, 200);
		x++;
		if (x > 400)
			x = 0;
		// on envoie toutes les données du buffer mémoire vers le buffer
		// d'affichage
		strategy.show();
	}

	class RenderingThread extends Thread {
		/**
		 * Ce thread appelle le rafraichissement de notre fenêtre toutes les 10
		 * milli-secondes
		 */
		public void run() {
			while (true) {
				try {
					// on appelle notre propre méthode de rafraichissement
					graphicalRender();
					sleep(5);
				} catch (Exception e) {
				}
			}
		}
	}

	public static void main(String[] args) {
		new DoubleBufferingHardware();
		String url = "http://users.polytech.unice.fr/~dedale/cours/langages-programmation/java/FAQ_developpez.com/?page=sommaire";
		System.out.println(url);
	}
}